package com.example.basic.utils;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

/**
 * @Description：excel文件解析类
 */
public class ExcelUtils {

    public ExcelUtils(){
        throw new Error("工具类不允许实例化！");
    }

    /**
     * 获取并解析excel文件，返回一个二维集合
     * @param file 上传的文件
     * @return 二维集合（第一重集合为行，第二重集合为列，每一行包含该行的列集合，列集合包含该行的全部单元格的值）
     */
    public static ArrayList<ArrayList<String>> analysis(MultipartFile file) {
        ArrayList<ArrayList<String>> result = new ArrayList<>();
        //获取文件名称
        String fileName = file.getOriginalFilename();
        System.out.println(fileName);
        try {
            //获取输入流
            InputStream in = file.getInputStream();
            //判断excel版本
            Workbook workbook = null;
            if (judegExcelEdition(fileName)) {
                workbook = new XSSFWorkbook(in);
            } else {
                workbook = new HSSFWorkbook(in);
            }
            //获取第一张工作表
            Sheet sheet = workbook.getSheetAt(0);
            //从第二行开始获取
            for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
                //循环获取工作表的每一行
                Row sheetRow = sheet.getRow(i);
                //循环获取每一列
                ArrayList<String> cell = new ArrayList<>();
                for (int j = 0; j < sheetRow.getPhysicalNumberOfCells(); j++) {
                    //格式化单元格数据
                    DataFormatter dataFormatter = new DataFormatter();
                    //将每一个单元格的值装入列集合
                    cell.add(dataFormatter.formatCellValue(sheetRow.getCell(j)));
                }
                //将装有每一列的集合装入大集合
                result.add(cell);

                //关闭资源
                workbook.close();
            }
        }
        // 未找到文件
        catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 上传失败
        catch (IOException e) {
            e.printStackTrace();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /**
     * 判断上传的excel文件版本（xls为2003，xlsx为2007）
     * @param fileName 文件路径
     * @return excel2007及以上版本返回true，excel2007以下版本返回false
     */
    public static boolean judegExcelEdition(String fileName){
        // 如果excel文件版本为2003版，返回false
        if (fileName.matches("^.+\\.(?i)(xls)$")){
            return false;
        }else{
            return true;
        }
    }

    // 调用示例

    //接收文件上传
    /**
     @RequestMapping("/upload")
     public Map uploadFile(MultipartFile file){
     Map<String,Object> map = new HashMap<>(16);
     //解析excel文件
     List<ArrayList<String>> row = ExcelUtils.analysis(file);
     //打印信息
     for (int i = 0;i<row.size();i++){
     List<String> cell = row.get(i);
     for (int j = 0;j<cell.size();j++){
     System.out.print(cell.get(j)+" ");
     }
     System.out.println();
     }
     map.put("status","success");
     return map;
     }
     */
}
